import Snake from "./Snack";
import Food from "./Food";
import ScorePanel from "./ScorePanel";

export default class GameControl{
    // 三个属性 实例
    snake: Snake
    scorePanel: ScorePanel;
    food: Food;
    // 蛇头运行方向
    direction: string = '';

    // 蛇 是否存活
    isLive: boolean = true

    constructor (){
        this.snake = new Snake();
        this.scorePanel = new ScorePanel(10,2);
        this.food = new Food();
        
        this.init();
    }

    // 游戏初始化，游戏开始
    init(){
        // 绑定键盘事件
        document.addEventListener('keydown' , this.keyDownHandler.bind(this))
    
        this.run()
    }

    // w  KeyW
    // d  KeyD
    // s  KeyS
    // a  KeyA
    //上 ArrowUp  Up
    //下 ArrowDown Down
    //右 ArrowRight Right
    //左 ArrowLeft Left

    /**
     * 键盘事件属性 keyCode 已经废弃，
     * code属性 IE 未实现 
     * 使用 key 属性
     *  */  
    keyDownHandler(event: KeyboardEvent){
        // 检测 键盘事件
        this.direction = event.key;
    }

    /**
     * 蛇 运动的方法
     * 上   top 减小
     * 下   top 增大
     * 左   left 减小
     * 有   left 增大
     */
    run(){

        // 获取 蛇头的坐标位置
        let X = this.snake.X;
        let Y = this.snake.Y

        switch(this.direction){
            // 上
            case 'w':
            case 'W':
            case 'ArrowUp':
            case 'Up':
                // 移动一格
                Y -= 10;
                break;
            // 下
            case 's':
            case 'S':
            case 'ArrowDown':
            case 'Down':
                // 移动一格
                Y += 10;
                break;
            // 左
            case 'a':
            case 'A':
            case 'ArrowLeft':
            case 'Left':
                // 移动一格
                X -= 10;
                break;
            // 右
            case 'd':
            case 'D':
            case 'ArrowRight':
            case 'Right':
                // 移动一格
                X += 10;
                break;
        }
        // 吃到食物判断
        this.checkEat(X,Y)

        // 修改蛇的 位置
        try{
            debugger
            this.snake.X = X;
            this.snake.Y = Y;
        }catch(e: any){
            alert( e.message +'GAME OVER!');
            this.isLive = false
        }
        
       this.isLive && setTimeout(this.run.bind(this), 300 - (this.scorePanel.level - 1) * 30);
    }

    // 检测是否吃到食物了
    checkEat(X: number, Y: Number){
        if(this.food.X === X && this.food.Y === Y){
            this.food.change();

            this.scorePanel.addScore();

            this.snake.addBody()
        }
    }
}